package org.xx.armory.ofs;

import java.util.Objects;

import static org.xx.armory.commons.Validators.greaterThan;
import static org.xx.armory.commons.Validators.notBlank;

/**
 * 用于访问文件对象的ID和哈希码。
 */
public final class IdAndHash {
    private final long id;
    private final String hash;

    /**
     * 构造{@code IdAndHash}对象的实例。
     *
     * @param id
     *         文件对象ID。
     * @param hash
     *         文件对象的Hash。
     * @throws IllegalArgumentException
     *         如果参数 {@code id} 小于或者等于0，或者参数 {@code hash} 只包含空白字符。
     */
    public IdAndHash(
            long id,
            String hash
    ) {
        this.id = greaterThan(id, "id", 0L);
        this.hash = notBlank(hash, "hash").trim();
    }

    /**
     * 获取文件对象的ID。
     *
     * @return 文件对象的ID。
     */
    public final long getId() {
        return this.id;
    }

    /**
     * 获取文件对象的Hash。
     *
     * @return 文件对象的Hash。
     */
    public final String getHash() {
        return this.hash;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final int hashCode() {
        return Objects.hash(this.getId(), this.getHash());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public final boolean equals(
            Object obj
    ) {
        if (obj == null) {
            return false;
        }
        if (obj instanceof IdAndHash) {
            IdAndHash other = (IdAndHash) obj;
            return Objects.equals(this.getId(), other.getId()) && Objects.equals(this.getHash(), other.getHash());
        } else {
            return false;
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return "{id=" + this.getId() + ",hash=" + this.getHash() + "}";
    }
}
